import java.util.*;

public class test {
    public static void main(String[] args) {
        Set<String> s = new TreeSet<>();
        /**
         * add(key):如果key不存在, 则插入, 返回true
         *          如果key存在, 则返回false
         *          如果key是空的, 则会抛出空指针异常
         */
        s.add("def0");
        s.add("fgh");
        s.add("hpo");
        s.add("jfj");
        s.add("okj");
        s.add("dja");
        boolean a1 = s.add("fgh");//key存在
        boolean a2 = s.add("abc");//key不存在
        //s.add(null);//抛异常
        System.out.println(a1);//false
        System.out.println(a2);//true

        /**
         * contains(key):如果key存在, 返回true, 否则返回false
         */
        System.out.println(s.contains("abc"));//true
        System.out.println(s.contains("hji"));//false

        /**
         * remove(key):key存在, 删除成功返回true
         *             key不存在, 删除失败返回false
         *             key为空, 抛出空指针异常
         */
        s.remove("abc");
        System.out.println(s);

        /**
         * 迭代器
         */
        Iterator<String> it = s.iterator();
        while(it.hasNext()){
            System.out.print(it.next()+" ");
        }
        System.out.println();
    }
    public static void main2(String[] args) {
        TreeMap<String,Integer> treeMap = new TreeMap<>();
        /**
         * put(Key,Value) : 插入 Key-Value 的键值对
         * 如果 Key不存在 ,会将 Key-Value 键值对插入到 Map中 , 返回null
         */
        treeMap.put("蔡旭困",1);
        treeMap.put("hello",12);

        Integer a1 = treeMap.put("wsz",23);
        System.out.println(a1);//返回null

        treeMap.put("wsa",null);//Key不能为空 , 但是 Value可以为空

        Integer a2 = treeMap.put("wsz",21);//如果Key存在 ,会使用 新的Value 来替换 原来的Value ,返回旧Value
        System.out.println(a2);//返回旧Value23

        /*------------------------------------------------*/
        /**
         * get(Key) : 返回Key所对应的Value
         * 如果Key存在 , 返回 Key 所对应的 Value
         * 如果Key不存在 , 返回 null
         */
        System.out.println(treeMap.get("wsz"));//21
        System.out.println(treeMap.get("sdf"));//null

        /*------------------------------------------------*/
        //getOrDefault(Key,Value): 如果Key存在 ,返回与Key对应的Value , 如果不存在 , 返回一个默认值
        System.out.println(treeMap.getOrDefault("wsz", 21));//21
        System.out.println(treeMap.getOrDefault("sdf",1));//不存在Value , 返回一个默认值1

        System.out.println(treeMap.size());//4

        /*------------------------------------------------*/
        /**
         * containKey(Key):用来检测Key是否包含在Map中
         * 按照红黑树的性质来进行查找
         * 找到返回true ,否则返回false
         */
        System.out.println(treeMap.containsKey("蔡旭困"));

        /**
         * containValue(Value) :检测Value是否包含在 Map 中
         * 找到返回 true ,否则返回 false
         */
        System.out.println(treeMap.containsValue(1));//true

        /*------------------------------------------------*/
        /**
         * 打印所有的Key
         * keySet()是将Map中的Key防止在Set中返回
         */
        for (String s:treeMap.keySet()) {
            System.out.print(s+" ");
        }
        System.out.println();

        /**
         * 打印所有的Value
         * Value()是将Map中的Value放在 collect的一个集合中返回的
         */
        for (Integer x:treeMap.values()) {
            System.out.print(x+" ");
        }
        System.out.println();
        /**
         * 打印所有的键值对
         * entrySet() : 将Map中的键值对放在Set中返回了
         */
        for (Map.Entry<String, Integer> entry:treeMap.entrySet()) {
            System.out.println(entry.getKey()+"-->"+entry.getValue());
        }
        System.out.println();
    }
    public static void main1(String[] args) {
        BinarySearchTree bst = new BinarySearchTree();
        bst.insert(1);
        bst.insert(2);
        bst.insert(3);
        bst.insert(4);
        bst.insert(5);

        BinarySearchTree.TreeNode ret = bst.search(3);
        System.out.println(ret.val);

    }
}
